<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>tbox</title>
  <link rel="icon" href="/assets/img/favicon.ico">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  <meta name="description" content="Description">
  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <link href="//cdn.jsdelivr.net/npm/github-markdown-css@4.0.0/github-markdown.min.css" rel="stylesheet">
  <style>
	.markdown-body {
		box-sizing: border-box;
		min-width: 200px;
		max-width: 980px;
		margin: 0 auto;
		padding: 45px;
	}

	@media (max-width: 767px) {
		.markdown-body {
			padding: 15px;
		}
	}
  </style>
</head>
<body>
<article class="markdown-body">
<h4>This is a mirror page, please see the original page: </h4><a href="https://tboox.io/#/zh-cn/manual/basic">https://tboox.io/#/zh-cn/manual/basic</a>
</br>
    <h2 id="">打印输出</h2>
<h3 id="info">打印info信息</h3>
<p>在终端下显示输出一行信息，会自动换行，调试、发布模式都会显示</p>
<pre><code class="lang-c">tb_trace_i("hello world");
</code></pre>
<p>显示：<code>[tbox]: hello world</code></p>
<p>!> 每行输出都带有标记前缀，来表示哪个模块的信息，默认是<code>[tbox]</code>， 但也可以通过修改<code>TB_TRACE_PREFIX</code>宏来重定义。</p>
<h3 id="">打印调试信息</h3>
<p>输出调试信息，仅在调试模式下起作用。</p>
<pre><code class="lang-c">tb_trace_d("hello world");
</code></pre>
<p>显示：<code>[tbox]: hello world</code></p>
<p>!> 只有在开启调试模式：make config DEBUG=y的情况，或者模块内部定义了<code>TB_TRACE_MODULE_DEBUG == 1</code>的时候才会进行输出，否则编译的时候会直接忽略掉。</p>
<h3 id="">打印警告信息</h3>
<p>输出警告信息，调试、发布模式都会显示</p>
<pre><code class="lang-c">tb_trace_w("hello world");
</code></pre>
<p>显示：<code>[tbox]: [warning]: hello world</code></p>
<h3 id="">打印其他信息</h3>
<p>提示某些功能还没实现。</p>
<pre><code class="lang-c">tb_trace_noimpl();
</code></pre>
<p>显示：<code>[tbox]: [no_impl]: at func: ..., line: ..., file: ...</code></p>
<h3 id="">分模块打印</h3>
<p>输出子模块标记</p>
<pre><code class="lang-c">#define TB_TRACE_MODULE_NAME             "module"
#include "tbox.h"

tb_trace_i("hello world");
</code></pre>
<p>显示：<code>[tbox]: [module]: hello world</code></p>
<h3 id="">输出到文件</h3>
<pre><code class="lang-c">tb_trace_mode_set(TB_TRACE_MODE_FILE);
tb_trace_file_set_path("/tmp/log", tb_false);
</code></pre>
<p>就可以输出到/tmp/log中了。</p>
<h3 id="">其他平台输出</h3>
<p>在ios和android下，除了会输出到调试终端，还会直接输出到syslog中， 可以通过adb logcat 或者xcode直接查看</p>
<h2 id="">断言与检测</h2>
<p>断言，是一种快速有效的在调试期，检测并响应错误的机制，如果在每个接口的输入输出等位置， 加一些assert，可以提早发现程序中隐藏的bug，提高开发和调试效率。</p>
<h3 id="">静态断言</h3>
<p>在编译期进行检测，一般用于类型大小、常量的检测，例如：</p>
<pre><code class="lang-c">tb_assert_static(sizeof(tb_byte_t) == 1);
tb_assert_static(sizeof(tb_uint_t) == 4);
tb_assert_static(sizeof(tb_uint8_t) == 1);
tb_assert_static(sizeof(tb_uint16_t) == 2);
tb_assert_static(sizeof(tb_uint32_t) == 4);
tb_assert_static(sizeof(tb_hize_t) == 8);
</code></pre>
<h3 id="">运行时断言</h3>
<p>在调试模式下进行检测，仅在调试模式下有效，如果<strong>tb_debug</strong>没有被定义，这些代码都会被忽略</p>
<p>如果断言失败，则会触发abort，并且打印完整详细的当前位置堆栈</p>
<pre><code class="lang-c">tb_assert(x);
</code></pre>
<h3 id="">运行时检测</h3>
<p>在发布模式下进行检测，不管是否在调试模式，都会进行检测</p>
<pre><code class="lang-c">tb_check_return(x);
tb_check_return_val(x, v);
tb_check_goto(x, b);
tb_check_break(x);
tb_check_abort(x);
tb_check_continue(x);
</code></pre>
<h3 id="">断言并检测</h3>
<p>在调试和发布模式下同时进行检测</p>
<pre><code class="lang-c">tb_assert_and_check_abort(x);
tb_assert_and_check_return(x);
tb_assert_and_check_return_val(x, v);
tb_assert_and_check_goto(x, b);
tb_assert_and_check_break(x);
tb_assert_and_check_continue(x);
</code></pre>
</article>
</body>
</html>